#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

#define SIZE    1024*1024*10  //10MB

unsigned long fileLength(int fd)
{
    //1、先保存此时文件的光标位置
    int curPos = lseek(fd,0,SEEK_CUR);
    //2、将文件的光标偏移到文件末尾
    //3、获取lseek的返回值就是文件的字节数
    unsigned long size = lseek(fd,0,SEEK_END);
    
    //4、将文件的光标偏移到之前保存的位置
    lseek(fd,curPos,SEEK_SET);

    return size;
}

int main()
{
    //将1.txt拷贝到2.txt
    //1、打开1.txt文件，以可读的方式打开
    int srcFd = open("ubuntu2004.rar",O_RDONLY);
    if(srcFd == -1){
        perror("open error");
        return -1;
    }
    //2、打开2.txt文件，以可写的方式打开，如果文件不存在，则创建，如果存在了清空
    int destFd = open("1.rar",O_WRONLY|O_CREAT|O_TRUNC,0777);
    if(destFd == -1){
        perror("open error");
        return -1;
    }
    //获取文件的大小
    unsigned long fileSize = fileLength(srcFd);
    printf("fileSize = %lu\n",fileSize);
    //定义一个变量  文件进度比
    unsigned long cnt = 0;
    int startTime = time(NULL);

    char *pbuf = malloc(SIZE);

    while(1)
    {
        //3、读取1.txt文件中的内容
        memset(pbuf,0,SIZE);

        int rbyte = read(srcFd,pbuf,SIZE);
        if(rbyte == -1){
            perror("read error");
            return -1;
        }
        else if(rbyte == 0) //读取完了
        {
            printf("read end\n");
            break;
        }
        //4、并写入到2.txt文件中  读到多少就写多少
        int wbyte = write(destFd,pbuf,rbyte);
        
        //printf("rbyte = %d wbyte=%d\n",rbyte,wbyte);

        cnt+=rbyte;//每次读取的字节数进行累加
        printf("已拷贝%lu字节 约%.2fMB  进度%.2f\n",cnt,cnt*1.0/1024/1024, (cnt*1.0 / fileSize) *100);
    }
    
    
    int endTime = time(NULL);
    
    printf("拷贝完成，共耗时%d秒\n",endTime-startTime);

    //5、关闭文件
    close(srcFd);
    close(destFd);

    free(pbuf);
}